/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.modales;

import co.com.ces4.produccion.client.SolicitudProduccionService;
import co.com.ces4.produccion.client.SolicitudProduccionServiceAsync;
import co.com.ces4.produccion.client.modales.interfaces.HasSolicitudModal;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionDS;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionRecord;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RadioButton;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.SortDirection;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.WidgetCanvas;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import java.util.Date;
import java.util.List;

/**
 *
 * @author usuario
 */
public class SolicitudProduccionModal extends Window {

    private final SectionStack mainPanel;
    private DynamicForm frmFiltrosBusqueda;
    private DateItem dtpFechaInicio, dtpFechaFin;
    private final SectionStackSection formSection;
    private final SectionStackSection resultSection;
    private ButtonItem btnConsultar, btnLimpiar;
    private ListGrid resultsGrid;
    private HasSolicitudModal parent;

    public SolicitudProduccionModal(final HasSolicitudModal parent) {
        this.parent = parent;
        mainPanel = new SectionStack();
        mainPanel.setWidth100();
        mainPanel.setHeight100();
        mainPanel.setVisibilityMode(VisibilityMode.MULTIPLE);
        mainPanel.setShowExpandControls(false);
        mainPanel.setAnimateSections(true);
        mainPanel.setAlign(Alignment.CENTER);
        setTitle("Búsqueda Articulos");
        setIsModal(true);
        setShowModalMask(true);
        centerInPage();
        setWidth(518);
        setHeight(600);
        setShowMinimizeButton(false);
        formSection = new SectionStackSection();
        formSection.setExpanded(true);
        formSection.setCanCollapse(true);

        dtpFechaInicio = new DateItem("dtpFechaInicio", "Fecha de Inicio");
        dtpFechaInicio.setUseTextField(true);
        dtpFechaInicio.setRequired(true);
        dtpFechaInicio.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);
        dtpFechaFin = new DateItem("dtpFechaFin", "Fecha de Fin");
        dtpFechaFin.setUseTextField(true);
        dtpFechaFin.setRequired(true);
        dtpFechaFin.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);

        btnConsultar = new ButtonItem("btnConsultar", "Consultar");
        btnConsultar.setColSpan(2);
        btnConsultar.setStartRow(true);
        btnConsultar.setEndRow(false);
        btnConsultar.setAlign(Alignment.RIGHT);
        btnConsultar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                solicitudesList();
            }
        });

        btnLimpiar = new ButtonItem("btnLimpiar", "Limpiar");
        btnLimpiar.setColSpan(2);
        btnLimpiar.setStartRow(false);
        btnLimpiar.setEndRow(true);
        btnLimpiar.setAlign(Alignment.LEFT);
        btnLimpiar.setTop(10);
        btnLimpiar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                frmFiltrosBusqueda.clearValues();
                clearResults();
            }
        });

        frmFiltrosBusqueda = new DynamicForm();
        frmFiltrosBusqueda.setHeight("15px");
        frmFiltrosBusqueda.setCellPadding(10);
        frmFiltrosBusqueda.setMargin(15);
        frmFiltrosBusqueda.setWidth100();
        frmFiltrosBusqueda.setNumCols(4);
        frmFiltrosBusqueda.setItems(dtpFechaInicio, dtpFechaFin, btnConsultar, btnLimpiar);

        formSection.setShowHeader(false);
        formSection.setItems(frmFiltrosBusqueda);

        resultSection = new SectionStackSection();
        resultSection.setExpanded(true);
        resultSection.setCanCollapse(false);
        resultSection.setTitle("Resultados");

        resultsGrid = new ListGrid() {

            @Override
            protected Canvas createRecordComponent(final ListGridRecord record, Integer colNum) {
                String fieldName = this.getFieldName(colNum);
                if (fieldName.equals(SolicitudProduccionDS.CARGARSOLIPRO)) {
                    RadioButton rb = new RadioButton("Seleccionar");
                    rb.setHeight("10px");
                    rb.setWidth("20px");
                    rb.addClickHandler(new com.google.gwt.event.dom.client.ClickHandler() {

                        public void onClick(com.google.gwt.event.dom.client.ClickEvent event) {
                            SolicitudProduccion solProSeleccionado = (SolicitudProduccion) record.getAttributeAsObject("solicitudProduccion");
                            if (solProSeleccionado.getSnestado()) {
                                parent.modalSolicitud(solProSeleccionado);
                                SolicitudProduccionModal.this.hide();
                            } else {
                                SC.warn("Advertencia", "Señor usuario, la solicitud de producción seleccionada se encuentra cancelada", new BooleanCallback() {

                                    @Override
                                    public void execute(Boolean value) {
                                    }
                                }, new Dialog());
                                Loader.hideLoader();
                                return;
                            }
                        }
                    });
                    WidgetCanvas wc = new WidgetCanvas(rb);
                    wc.setHeight("12px;");
                    wc.setWidth("20px;");
                    return wc;
                } else {
                    return null;
                }
            }

            @Override
            protected String getBaseStyle(ListGridRecord record, int rowNum, int colNum) {
                if (getFieldName(colNum).equals("estadoSolicitud")) {
                    if (record.getAttribute("estadoSolicitud").equals("Activa")) {
                        return "estadoActivo";
                    } else {
                        return "estadoInactivo";
                    }
                } else {
                    return super.getBaseStyle(record, rowNum, colNum);
                }
            }
        };
        resultsGrid.setWidth100();
        resultsGrid.setHeight100();
        resultsGrid.setDataSource(new SolicitudProduccionDS());
        resultsGrid.setAutoFetchData(true);
        resultsGrid.setFields(SolicitudProduccionRecord.getFields());
        resultsGrid.setEmptyMessage("No hay registros para mostrar");
        resultsGrid.setFilterOnKeypress(true);
        resultsGrid.setShowFilterEditor(true);
        resultsGrid.hideField(SolicitudProduccionDS.ESTADO);
        resultsGrid.getField(SolicitudProduccionDS.FECHASOLICITUD).setWidth(140);
        SortSpecifier[] specifiers = new SortSpecifier[]{new SortSpecifier(SolicitudProduccionDS.FECHASOLICITUD, SortDirection.DESCENDING)};
        resultsGrid.setSort(specifiers);
        resultsGrid.setShowRecordComponents(true);
        resultsGrid.setShowRecordComponentsByCell(true);
        resultSection.setItems(resultsGrid);
        mainPanel.addSection(formSection);
        mainPanel.addSection(resultSection);

        addItem(mainPanel);
    }

    private void solicitudesList() {
        if (frmFiltrosBusqueda.validate()) {
            Date fechaInicio = dtpFechaInicio.getValueAsDate();
            Date fechaFin = dtpFechaFin.getValueAsDate();
            if (dtpFechaInicio.getValueAsDate().before(dtpFechaFin.getValueAsDate()) || dtpFechaInicio.getValueAsDate().getDate() == dtpFechaFin.getValueAsDate().getDate()) {
                Loader.showLoader();
                final AsyncCallback<List<SolicitudProduccion>> queryCallback = new AsyncCallback<List<SolicitudProduccion>>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(List<SolicitudProduccion> result) {
                        clearResults();
                        for (int i = 0; i < result.size(); i++) {
                            resultsGrid.addData(new SolicitudProduccionRecord(result.get(i)));
                        }
                        Loader.hideLoader();
                    }
                };
                getSolicitudProduccionService().getSolicitudProduccionList(fechaInicio, fechaFin, queryCallback);
            } else {
                SC.warn("Advertencia", "La fecha de inicio no puede ser mayor que la fecha de fin", new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());

                return;
            }
        }
    }

    private void clearResults() {
        ListGridRecord[] records = resultsGrid.getRecords();
        if (records.length > 0) {
            for (int i = 0; i < records.length; i++) {
                resultsGrid.removeData(records[i]);
            }
        }
    }

    private SolicitudProduccionServiceAsync getSolicitudProduccionService() {
        return GWT.create(SolicitudProduccionService.class);
    }
}
